Nginx Configuration
2017년 11월 17일 금요일
오전 10:40
링크: https://www.linode.com/docs/web-servers/nginx/how-to-configure-nginx
Nginx 는 가벼우면서도
고성능인 웹서버이다. (웹서버 양대산맥은 Nginx vs
Apache)
많은 양의 Static contents를 빠르게 제공하고, 시스템 리소스를 효율적으로
사용한다
request 가 밀려들어오면
1) Apache 웹서버는
동기식으로 쓰레드나 프로세스들을 늘려서 대응한다.
2) Nginx 웹서버는 비동기식으로 event-driven 형태로 대응한다. request 로드에 대한
퍼포먼스 예측이 용이하다
Dynamic contents 에 대해서는
1) embedded interpreter 를 사용하지 않는다. (내부적으로 바로바로 처리하지 않는다는 것)
2) CGI, FASTCGI 로
넘겨버리거나, 심지어, Apache 와 같은 다른 웹서버로
넘겨버리기도 한다
- 처리가 되고나면 결과를
Nginx 웹서버로 회신주고, Nginx는 클라이언트
(=브라우저)로 전달
- 모두 /etc/nginx 폴더에 있다.
- 대표적 configuration file은 /etc/nginx/nginx.conf
이다.
* 혹시나 없으면
/opt/nginx/conf/ 폴더를 볼것
- 잘못 만지면 안되니
원래 conf 파일은 백업해두자.
cp /etc/nginx/nginx.conf
/etc/nginx/nginx.conf.backup
- 좋은 습관은 날짜정보를
담아서 백업하는 거다. 스크립트로 만들어둬도 될듯
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date
"+%b_%d_%Y_%H.%M.%S")
- /etc/nginx/nginx.conf 파일을 변경한 후 적용하려면 reload 해줘야 한다
service nginx reload
* 안되면 sudo를 먹여주자. sudo
service nginx reload
/etc/nginx/nginx.conf 파일
- 처음에는 웹서버의 core 가 되는 기본동작 설정
- 그다음엔 HTTP 블록, server 블록
- 마지막으로 virtual host 설정 파일들
- 웹서버의 기본 동작
정의 부분
|
* 위는 예시, 아래는 진짜 내가 깔아놓은 Nginx 정보 user - 리눅스 시스템의
누가 nginx server의 주인으로서 구동시키는가? - debian 기반
리눅스에선 www-data 라고 생각하면 된다. worker_processes - Nginx가 구동할
쓰레드 개수, 또는 동시 인스턴스 개수 - 나중에 좀 더 자세히
보자. http://nginx.org/en/docs/ngx_core_module.html#worker_processes pid - Nginx 의 master process 의 PID - (Linux) OS가
추적하고 signal을 보내기 위해 쓰인다. - cat /nginx.pid 해보니 값이 나온다.
|
- HTTP web traffic 을 어떻게 핸들링할지 설정하는 부분
|
|
* 왼쪽이 예제, 오른쪽이 실제 캡처 - 보통은 as-is, 즉 현재 상태를 정리해 놓은
거다. include - c 파일의 include 를 떠올리면 된다. - /etc/nginx/mime.types 문서안의 내용이 붙여넣어진다는 것 - /etc/nginx/nginx.conf 파일의 http {} 안에 다 때려넣으면 정신없잖아? * 특정 폴더안의 전체
내용을 가져올 수도 있다. include /etc/nginx/sites-enabled/*; * 아니면 특정 확장자도
가능 include /etc/nginx/conf.d/*.conf; gzip - on-the-fly (= 대충, 후다닥) 압축을 사용하여 - 밴드위쓰 제한하고
전송속도를 빠르게 한다. - Apache 웹서버의
mode-deflate 와 같다. - gzip 더보기: http://nginx.org/en/docs/http/ngx_http_gzip_module.html * HTTP 블록 더보기 |
위에 언급하진
않았지만
HTTP 블록에는 include /etc/nginx/sites-enabled/*; 이 있다.
- 이렇게 해두면 server 블록에서는
- site-enabled 서브
디렉토리에서 분리된 파일들을 찾을 수 있다.
* 보통 site-enabled 의 파일들은 실제
/etc/nginx/sites-available/ 폴더내 파일의 symlink
이다.
** symlink 를
통해 원본 파일 (= /etc/nginx/sites-available/
)은 보존한 상태에서 virtual sever를
enable / disable 가능하다.
- 심볼릭링크는 다양한
위치의 원본파일을 한군데 모으기 위해 사용하기도 한다.
- 사용법: http://idolpia.blog.me/221108193365
/etc/nginx/sites-available/ 에는 default 라는 파일이 있으며, 이 파일은 일종의 template 파일이다.
이걸 복사해서, 내가 원하는 방법대로 사용하면 된다
(중요) 결국 http 블록의 include
/etc/nginx/sites-enabled/*; 는 예를 들어
- 실제로는 sites-available 폴더에 있는 100개의 사이트 정보 파일들
중에서
- 쓰기를 원하는 사이트
정보 파일들만을 simlink 하는 것이다. simlink를 나중에 삭제해도 원본은 sites-available에
남아있게 된다
default를 비롯한
내부의 파일들에 정의된 server 블록들을 가져오는 것이다.
* default 의 주석처리 안된 부분 참고
|
원문링크의
내용을 보고 server 블록을 이해해보자
server 블록은 사용자가
디폴트 설정에서 가장 많이 수정하는 부분이다.
우선 server 블록의 listen 을
보자
- nginx 서버에게, 듣고 있어야 할
IP와 port 를 알려준다.
- 여러 예제를 보자
|
1) default_sever - 80 포트로 들어온 request를 - 다른 virtual host 가 request 에 응답하지 않으면 - 이 server { } 가 처리할 것임 2) 두번째 줄도 같은 의미임 - 다만 IPv6 대응을 의미 |
|
1) local loopback interface 인 127.0.0.1:80을
듣겠다는 것 2) localhost 는 127.0.0.1 을
의미하는데 - 이것은 /etc/hosts 파일에 정의되어 있다.
|
|
이번에도 localhost 를 listen 하지만 이번에는 8080포트를
listen |
|
특정 IP address 의 특정 port 를 listen 하겠다는 것 |
|
1) 80 또는 *:80은
모든 IP의 80 포트
listen 하겠다는 것 2) 8080 또는 *:8080은
모든 IP의 8080 포트 listen 하겠다는 것 |
|
특정 IP의 80 포트를 listen 하겠다는 것 |
다음엔 server 블록의 server_name 을
보자
- 여러 예시
|
example.com 으로의 request를 nginx 가 처리하라 |
|
example.com 또는 www.example.com 둘 다
nginx 가 처리하라 |
|
*.example.com 과 .example.com 은
같은 의미이며 - 모든 서브도메인을 nginx 가 처리하라는 것 - 예를 들면 foo.example.com |
|
이번에는 example 로 시작하는 모든 도메인 - 예를 들면 example.net / example.com / example.org 등등 |
|
다른 여러 도메인 이름도 처리 |
|
valid 한 host name 이
아니더라도 /etc/hosts 파일에 정의되면 쓸 수 있다.
|
|
모든 request 다 처리하자 |
1) Access Logs
- http 블록이건, server 블록이건 어디든 정의되면 된다.
- access.log 파일의
위치이다.
|
상대주소로 명시할 수도 있고 |
|
절대주소를 쓸 수도 있다. |
|
아니면 아예 쓰지 않도록 할 수도 있다. |
- server 블록에 정의되는 마지막 녀석
- nginx 웹서버가 request에 대하여 서버내 자원으로 어떻게 response 할지를
설정하는 것
- server_name
이 domain name 에 대하여 어떻게 처리할지를 설정한 것이라면 - location은 도메인 뒤에 붙는 특정 폴더, 특정 파일에 대한 처리를 설정하는 것이다. |
몇몇 예시를
보자
|
말 그대로 도메인 뒤에 들어오는 대로 처리해주면 된다.
예를 들여 누군가가 http://example.com
으로 요구를 한다고 할때 각각은 다음과 대칭된다 - http://example.com/planet/blog 이렇게 쳐서 들어오는 request 에 대한 처리가 { } 안에 명시되는 것이다. * /planet/ 은 /planet/about/ 등과 같은 것들도 처리해준다 |
|
~ (tilde) 로 시작하는 경우는 - 정규식 매치를 해준다 (regular expression). 정확히는 PCRE - Perl
Compatible Regular Expressions - 대소문자를 가린다 (case sensitive) 1) 따라서 첫줄은
IndexPage.php 에 대한 처리를 { } 안에서 해주겠다는 것이고 2) 두번째 줄
/BlogPlanet(/|/index\.php)$ 는 /BlogPlanet/ 또는 /BlogPlanet/index.php 를 { } 안에서 처리해주겠다는
것 |
|
~* (tilde 와 *) 로 시작해주면
대소문자를 무시한다 = case insensitive 1) 은 파일 확장자가 .pl .cgi .perl .prl 인 경우를 모두 처리한다 2) 는 파일 확장자가 .md .mdwn .txt .mkdn 인 경우를 모두 처리한다 |
|
^~ 로 시작해주면 - 특정한 문자열을
만나기만 하면 - location 에서
더 정확하게 찾으려 말고 여기의 { } 설정대로 하라는 것이다. (location 간의
우선순위는 나중에 더 보자) |
|
= 는 정확하게 매칭이 되어야 한다는 것을 말한다 - 맨 처음에 = 가 없을때는 * /planet/ 은 /planet/about/ 등과 같은 것들도
처리해준 것을 기억하자 - 예를 들어 http://example.com 만 처리하지, http://example.com/index.html
은 처리해주지 않는다 * 이거하면 request 처리 속도가 쪼금 빨라질수가 있다. |
location 우선순위는
1) 정확하게 string 같으면
바로 수행 2) ^~ 에서 명시된 부분이 포함되면 여기서 수행 3) ~ 또는 ~* 정규식과
매칭이 되면 여기서 수행 4) 남은중에서 가장 맞는 녀석으로 수행 - 도메인 아래의 파일과 폴더들은 최소한 하나의
location 설정과 매칭되어야 한다 |
3) Location Root 와 Index
location 역시 블록을
가지고 있다.
|
일단 request가 가장 적합한 location을 만나면 그 location 블록
(= {} ) 이 지시하는대로 수행한다 root - 이 경우는 html 폴더를 의미하며
/etc/nginx/html/ 이다. - 만약 http://example.com/blog/includes/style.css 라고 request 가
왔는데 여기서 처리한다면 - blog라는 폴더가
없으므로 - /etc/nginx/html/blog/includes/style.css 를 찾아서 return 해준다
* 여기선 상대주소를
줬지만 절대주소를 줄수도 있다. = /etc/nginx/html/ index - root 가 폴더를
의미한다면 - index는 그
폴더에서 매칭이 되는 파일을 실행한다 - 여기서는 우선 index.html 을 찾고, 없으면 index.htm 을 실행한다 * 만약 둘다 없다면? 404 에러 메시지! |
|
1) 첫번째 location은
어렵지 않을 것이다. - 그냥 root의 위치를 알려주고 - 거기에서 실행될
파일명을 알려준다 2) 두번째는 확장자가 .pl인
경우 여기를 이용하라는 것이다. |
좋은 링크였는데
upstream 에 대한 설명이 없어서 아쉬웠음
upstream 은 링크
참고: http://nginx.org/en/docs/http/ngx_http_upstream_module.html
하나만 보자면
|
1) 1번의 location 규칙에
맞게 들어오는 녀석은 - 일단 proxy_pass 로 특정 서버(?)로 보낸다 - 내부 서버로 보낼
수도 있고 (=예를 들면, gunicorn 으로 생성한
내부 서버) - 아예 외부의 서버로
보낼 수도 있다. 여기서는 nginx 내부의 backend, dynamic 이라는 추상적 upstream 서버로 보낸 것이다. 2) upstream server로 흘러들어온 request
들은 - weight 에
따라 로드발란싱되며 분배되기도 하고 - 암튼 다양한 옵션에
따라 처리된다 |
Microsoft OneNote 2016에서 작성